#ifndef TASKITEM_H
#define TASKITEM_H

#include <DApplication>
#include <DGuiApplicationHelper>
#include <QCheckBox>
#include <scheduletask.h>

DWIDGET_USE_NAMESPACE

class TaskMenu;

class TaskItem : public QWidget
{
    Q_OBJECT
public:

    enum Mode {
        // Basic Mode
        NoMode  = 0x00,
        Bell    = 0x01,     // 提醒   在日历中设置提醒。
        Pining  = 0x02,     // 置顶   尽量显示在其他任务上方。
        CountdownHot = 0x03,        // 抢票模式，任务开始前1小时之前的状态
        CountdownTimer = 0x04,      // 抢票模式，任务开始前1小时～任务开始时间前5秒的状态
        CountdownProcess = 0x05,    // 抢票模式，任务开始前5秒～任务开始时间的状态
    };

    enum Modifier {
        NoModifier = 0x00,
        Timer   = 0x01,     // 计时器  任务进行中，提醒时间（开始时间）< 当前时间 < 结束时间
        Warn    = 0x02,     // 警告   任务的结束时间到了，但任务未完成。
        Check   = 0x03,     // 已选中
    };

    explicit TaskItem(QWidget *parent = nullptr);
    virtual ~TaskItem() override;
    virtual QSize minimumSizeHint() const override;
    virtual QSize sizeHint() const override;

    void setTask(const ScheduleDataInfo &task);
    bool isChecked();
    Mode getMode();
    QDateTime getBeginDateTime();
    void refreshMode();
    void freshMenu();

    void fadeAnimate();
    void bloomAnimate();
    void progressAnimate();

    void onCountdown();


protected:
    virtual void paintEvent(QPaintEvent *event) override;
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void mouseReleaseEvent(QMouseEvent *event) override;
    virtual void mouseMoveEvent(QMouseEvent *event) override;

private:
    QColor m_backgroundColor;
    ScheduleDataInfo m_task;
    int m_drawHeight;
    int m_drawWidth;
    int m_alpha;
    bool progressHint = false;
    bool piningHint = false;
    bool repeatHint = false;
    bool countdownHint = false;
    bool timerFlick = false;
    Mode m_mode = NoMode;
    Modifier m_modifier = NoModifier;
    QCheckBox checkBox;
    TaskMenu* menu;



private slots:
    void onThemeChanged(DGuiApplicationHelper::ColorType type);
    void onColorValueChanged(const QVariant &color);
    void openSchedule();
    void onModeActionToggled();
    void onClicked(bool state);
    void extDataChanged();

signals:
    void stateChanged();
    void faded();
};


#endif // TASKITEM_H
